package it.scambiocorse.dao;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import it.scambiocorse.model.AreaType;
import it.scambiocorse.model.CodaType;
import it.scambiocorse.model.ServizioType;
import it.scambiocorse.model.UtenteType;
import it.scambiocorse.rowmapper.AreaRowMapper;
import it.scambiocorse.rowmapper.CodaRowMapper;
import it.scambiocorse.utils.Utils;

import org.apache.log4j.Logger;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor;
import org.springframework.transaction.annotation.Transactional;

public class CodaDao extends JdbcDaoSupport implements CodaService  {
 
	final Logger logger = Logger.getLogger(getClass());

  protected void initDao() throws Exception {
    super.initDao();
    getJdbcTemplate().setNativeJdbcExtractor(new SimpleNativeJdbcExtractor());

  }
  
	@Transactional
	public int inserisciCoda(int idUser, int idServ) throws Exception {

			String metodo = "inserisciCoda(...) - ";
			logger.warn(metodo+"Inizio");
		  Number idCoda = 0;
		  try{ 
		  	
		  	SimpleJdbcCall caller = new SimpleJdbcCall(getJdbcTemplate())
		  	.withFunctionName("inserisciCoda");
		  	
		  	Map<String, Object> map = new HashMap<String, Object>(2);
		  	map.put("idUser", idUser);
		  	map.put("idServ", idServ);
		  	
		  	
		  	idCoda = caller.executeFunction(Number.class, map);

		  	if (idCoda.intValue() > 0) {
		  		logger.warn(metodo+" Esito: OK, coda INSERITA, idServ = "+idCoda.intValue());
		  	} else {
		  		logger.warn(metodo+" Attenzione: CODA NON INSERITA");
		  	}
		  	
		  } catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+metodo);
		  	logger.error(e);
		  }
		  
		  logger.warn(metodo+" Fine");
		  
		  return idCoda.intValue();
	}
	
	public CodaType getCoda(int idUser, int idServ) throws Exception {
		
		String metodo = "getCoda(...)";
		logger.warn(metodo+" - Inizio");
		  boolean ret = false;
		  CodaType coda = null;
		  
		  //String sql = "SELECT * FROM scambio.coda_tab where coda_tab.id_user = ? and coda_tab.id_serv = ?";
		  String sql = "SELECT * FROM coda_tab JOIN utente_tab u on coda_tab.id_user = u.id_user where coda_tab.id_user = ? and coda_tab.id_serv = ? ";
		  try{ 
		  	logger.warn(metodo+" - Chiamata SQL = "+sql+" idServ ="+idServ+" idUser ="+idUser);
		  	coda = (CodaType)getJdbcTemplate().queryForObject(sql, new Object[] {idUser, idServ}, new CodaRowMapper() );
		  	if (coda != null) {
		  		logger.warn(metodo+" Esito: OK, idCoda = "+coda.getIdCoda());
		  		ret = true;
		  	}

		  }
		  catch (EmptyResultDataAccessException em) {
		  	logger.warn(metodo+" Coda non esistente  \""+sql);
		  }
		  
		  catch (Exception e) {
		  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
		  	logger.error(e);
		  }
		  
		  logger.warn(metodo+" Fine");
		  
			return coda;
		
	}
	
	
	public ArrayList<CodaType> getListaCode(int idUser) throws Exception {
		String metodo = "getListaCodeAttive(...)";
		logger.warn(metodo+" - Inizio");
	  ResultSet rs = null; 
	  List ret = null;
	  String sql = "    SELECT * FROM  coda_tab  WHERE coda_tab.id_user = id_user where coda_tab.data_fine > sysdate;";
	  try{ 
	  	
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
	  	ret = (List<CodaType>) getJdbcTemplate().query(sql, new Object[] { idUser }, new  CodaRowMapper());
	  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
	  // Do whatever I want with resultset here... 
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+"La lista e' "+((ret == null) ? "NULL" : "PIENA"));
	  logger.warn(metodo+" Fine");
	  
		return (ArrayList<CodaType>)ret;
	}
	
	
//	public ArrayList<CodaType> getListaCodeAttive(int idUser) throws Exception {
//		String metodo = "getListaCodeAttive(...)";
//		logger.warn(metodo+" - Inizio");
//	  ResultSet rs = null; 
//	  List ret = null;
//	  String sql = "call listaCodeAttive(?)";
//	  try{ 
//	  	
//	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
//	  	ret = (List<CodaType>) getJdbcTemplate().query(sql, new Object[] { idUser }, new  CodaRowMapper());
//	  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
//	  // Do whatever I want with resultset here... 
//	  } catch (Exception e) {
//	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
//	  	logger.error(e);
//	  }
//	  
//	  logger.warn(metodo+"La lista e' "+((ret == null) ? "NULL" : "PIENA"));
//	  logger.warn(metodo+" Fine");
//	  
//		return (ArrayList<CodaType>)ret;
//	}

	
//	public ArrayList<CodaType> getListaCodeTerminate(int idUser) throws Exception {
//		String metodo = "getListaCodeTerminate(...)";
//		logger.warn(metodo+" - Inizio");
//	  ResultSet rs = null; 
//	  List ret = null;
//	  String sql = "call listaCodeTerminate(?)";
//	  try{ 
//	  	
//	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
//	  	ret = (List<CodaType>) getJdbcTemplate().query(sql, new Object[] { idUser }, new  CodaRowMapper());
//	  	logger.warn(metodo+" Esito: OK, grandezza lista "+ret.size());
//	  // Do whatever I want with resultset here... 
//	  } catch (Exception e) {
//	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
//	  	logger.error(e);
//	  }
//	  
//	  logger.warn(metodo+"La lista e' "+((ret == null) ? "NULL" : "PIENA"));
//	  logger.warn(metodo+" Fine");
//	  
//		return (ArrayList<CodaType>)ret;
//	}
	
	public ArrayList<CodaType> getCodePerServ(int idServ) throws Exception{
		
		String metodo = "esisteCoda(...)";
		logger.warn(metodo+" - Inizio");
	  ArrayList<CodaType> listaCodaPerServ = null;
	  String sql = "SELECT * FROM coda_tab JOIN utente_tab u on coda_tab.id_user = u.id_user where coda_tab.id_serv = ?";
	  try{ 
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" idServ ="+idServ);
	  	listaCodaPerServ = (ArrayList<CodaType>)getJdbcTemplate().query(sql, new Object[] {idServ}, new  CodaRowMapper());
	  	if (listaCodaPerServ != null && listaCodaPerServ.size() > 0) {
	  		logger.warn(metodo+" Esito: OK, grandezza lista = "+listaCodaPerServ.size());
	  	} else {
	  		logger.warn(metodo+" Nessuna CODA estratta");
	  		listaCodaPerServ = null;
	  	}

	  }
	  catch (EmptyResultDataAccessException em) {
	  	logger.warn(metodo+" Coda non esistente  \""+sql);
	  }
	  
	  catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return listaCodaPerServ;
		
	}

	@Transactional
	public int eliminaCodaUtenteDaServizio(int idServ, int idUser) throws Exception{
		String metodo = "eliminaCodaUtenteDaServizio(...)";
		logger.warn(metodo+" - Inizio");
	  ResultSet rs = null; 
	  int esito = 0;
	  String sql = "UPDATE coda_tab SET data_fine = ?, esito = ? WHERE id_user = ? AND id_serv = ?";
	  try{ 
	  	
	  	logger.warn(metodo+" - Chiamata SQL = "+sql+" ? = "+idUser);
	  	esito =  getJdbcTemplate().update(sql,  new Object[] {Utils.getSysDate(), "ANNULLATA", idUser , idServ });
	  	
	  	if (esito > 0) {
	  		logger.warn(metodo+" Esito: OK, Coda cancellata");
	  	} else {
	  		logger.warn(metodo+" Esito: KO, Coda NON cancellata");
	  	}
	  // Do whatever I want with resultset here... 
	  } catch (Exception e) {
	  	logger.warn(metodo+" Si e' verificato un errore GENERICO durante la seguente chiamata  \""+sql);
	  	logger.error(e);
	  }
	  
	  logger.warn(metodo+" Fine");
	  
		return esito;

	}

	
	
	
	
	

}
